package com.borened.common.core.util;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.map.MapUtil;
import com.borened.common.core.base.EChartsVO;
import org.springframework.lang.NonNull;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 图表工具
 *
 * @author cch
 * @since 2023-02-28
 */

public class EchartsUtils {
    /**
     * 返回一个空的echarts数据结构
     *
     * @return
     */
    public static EChartsVO<String, Object> emptyEcharts() {
        return new EChartsVO<>(new ArrayList<>(0), new ArrayList<>(0));
    }

    /**
     * 根据list对象和对象的key转换echart数据结构。输出数据的顺序根据传入的data元素的顺序决定
     *
     * @param data     数据集合，
     * @param xAxisKey x轴转换字段名
     * @param yAxisKey y轴转换字段名
     * @return
     */
    public static EChartsVO<String, Object> toEchartsVO(@NonNull List<?> data, @NonNull String xAxisKey, @NonNull String yAxisKey) {
        EChartsVO<String, Object> chartsVO = new EChartsVO<>(new ArrayList<>(), new ArrayList<>());
        if (CollUtil.isEmpty(data)) {
            return chartsVO;
        }
        for (Object datum : data) {
            Map<String, Object> obj = BeanUtil.beanToMap(datum);
            chartsVO.getXAxis().add(MapUtil.getStr(obj, xAxisKey));
            chartsVO.getYAxis().add(obj.get(yAxisKey));
        }
        return chartsVO;
    }

    /**
     * 根据list对象和对象的key转换echart数据结构。支持Y轴同时显示多项数据
     *
     * @param data      数据集合
     * @param xAxisKey  x轴转换字段名
     * @param yAxisKeys y轴转换字段名，支持多个
     * @return
     */
    public static EChartsVO<String, Object> toEchartsVO(@NonNull List<?> data, @NonNull String xAxisKey, @NonNull String... yAxisKeys) {
        EChartsVO<String, Object> chartsVO = new EChartsVO<>(new ArrayList<>(), new ArrayList<>());
        if (CollUtil.isEmpty(data)) {
            return chartsVO;
        }
        int keyIndex = 0;
        List<Map<String, Object>> dataList = data.stream().map(BeanUtil::beanToMap).collect(Collectors.toList());
        for (String stackedLineKey : yAxisKeys) {
            List<Object> subYaxis = new ArrayList<>();
            for (Map<String, Object> obj : dataList) {
                if (keyIndex == 0) {
                    chartsVO.getXAxis().add(MapUtil.getStr(obj, xAxisKey));
                }
                subYaxis.add(obj.get(stackedLineKey));
            }
            chartsVO.getYAxis().add(subYaxis);
            keyIndex++;
        }
        return chartsVO;
    }


}
